package com.yf.esms.config;

import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * @author yejc
 */


/**
 *
 *
 1. @Api
 用在类上，说明该类的作用
 @Api(value = "UserController", description = "用户相关api")

 2. @ApiOperation
 用在方法上，说明方法的作用
 @ApiOperation(value = "查找用户", notes = "查找用户", httpMethod = "GET", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)

 3 @ApiImplicitParams
 用在方法上包含一组参数说明

 4. @ApiImplicitParam
 用在@ApiImplicitParams注解中，指定一个请求参数的各个方面
 paramType：参数放在哪个地方
 header–>请求参数的获取：@RequestHeader
 query–>请求参数的获取：@RequestParam
 path（用于restful接口）–>请求参数的获取：@PathVariable
 body（不常用）
 form（不常用）
 name：参数名
 dataType：参数类型
 required：参数是否必须传
 value：参数的意思
 defaultValue：参数的默认值
 @ApiImplicitParams({
         @ApiImplicitParam(name = "id", value = "唯一id", required = true, dataType = "Long", paramType = "path"),
 })
 5. @ApiResponses
 用于表示一组响应

 6. @ApiResponse
 用在@ApiResponses中，一般用于表达一个错误的响应信息
 code：数字，例如400
 message：信息，例如”请求参数没填好”
 response：抛出异常的类
 @A{:piResponses(value = {  
           @ApiResponse(code = 400, message = "No Name Provided")  
   })
 7. @ApiModel
 描述一个Model的信息（这种一般用在post创建的时候，使用@RequestBody这样的场景，请求参数无法使用@ApiImplicitParam注解进行描述的时候）
 @ApiModel(value = "用户实体类")

 8. @ApiModelProperty
 描述一个model的属性
 @ApiModelProperty(value = "登录用户")

 Swagger接口请求有几个：
 http://localhost:8080/swagger-resources/configuration/ui
 http://localhost:8080/swagger-resources
 http://localhost:8080/api-docs
 http://localhost:8080/swagger-resources/configuration/security
  *
  * @title: Swagger2Config
 * @projectName vehicle-files-management
 * @description: swagger2配置类
 *
 * 附：使用Swagger生成JAVA Mock Server（Springboot）代码
 * http://blog.csdn.net/a78270528/article/details/78530702
 *
 *
 @Api：用在请求的类上，表示对类的说明
 tags="说明该类的作用，可以在UI界面上看到的注解"
 value="该参数没什么意义，在UI界面上也看到，所以不需要配置"


 @ApiOperation：用在请求的方法上，说明方法的用途、作用
 value="说明方法的用途、作用"
 notes="方法的备注说明"


 @ApiImplicitParams：用在请求的方法上，表示一组参数说明
 @ApiImplicitParam：用在@ApiImplicitParams注解中，指定一个请求参数的各个方面
 name：参数名
 value：参数的汉字说明、解释
 required：参数是否必须传
 paramType：参数放在哪个地方
 · header --> 请求参数的获取：@RequestHeader
 · query --> 请求参数的获取：@RequestParam
 · path（用于restful接口）--> 请求参数的获取：@PathVariable
 · body（不常用）
 · form（不常用）
 dataType：参数类型，默认String，其它值dataType="Integer"
 defaultValue：参数的默认值

 Zjr&
 @ApiResponses：用在请求的方法上，表示一组响应
 @ApiResponse：用在@ApiResponses中，一般用于表达一个错误的响应信息
 code：数字，例如400
 message：信息，例如"请求参数没填好"
 response：抛出异常的类


 @ApiModel：用于响应类上，表示一个返回响应数据的信息
 （这种一般用在post创建的时候，使用@RequestBody这样的场景，
 请求参数无法使用@ApiImplicitParam注解进行描述的时候）

 */
@Configuration
@EnableSwagger2
@EnableKnife4j
@Import(BeanValidatorPluginsConfiguration.class)
public class Swagger2 {

    @Bean
    public Docket createRestApi(){
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.yf.esms"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo(){
        return new ApiInfoBuilder()
                .title("搜索服务")
                .description("搜索服务api接口文档")
                .version("1.0")
                .build();
    }
}
